/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Cliente.Controller;

import Cliente.Entidade.Cliente;
import Cliente.View.CadastroCliente;
import Cliente.util.CalculaIAC;
import Cliente.util.CalculaIMC;
import Cliente.util.HabilitarCampos;
import Cliente.util.LimpaCampos;
import Cliente.util.Observable;
import Cliente.util.Observer;
import Cliente.util.OrganizarTexto;
import CommandCadastrar.CadastrarCommand;
import Inteface.Log;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ButtonGroup;
import javax.swing.JOptionPane;

/**
 *
 * @author Caio Valentim
 */
public class CadastroPresenter implements Observable {

    private static CadastroPresenter instancia;
    private ButtonGroup grupo = new ButtonGroup();
    private CalculaIAC calculaiac = new CalculaIAC();
    private CalculaIMC calculaimc = new CalculaIMC();
    private CadastroCliente view = new CadastroCliente();
    private String imc;
     private List<Observer> observers = new ArrayList<Observer>();

    public String getImc() {
        return imc;
    }

    public void setImc(String imc) {
        this.imc = imc;
    }

    public String getIac() {
        return iac;
    }

    public void setIac(String iac) {
        this.iac = iac;
    }
    private String iac;
    private Log log;
    private LimpaCampos limpacampos;
    private HabilitarCampos hc = new HabilitarCampos();
    private OrganizarTexto organizatexto = new OrganizarTexto();

    private void limpaCampos() {
        getView().getTxtAltura().setText("");
        getView().getTxtCintura().setText("");
        getView().getTxtIdade().setText("");
        getView().getTxtNome().setText("");
        getView().getTxtNome().setText("");
        getView().getFtfCPF().setText("");
        getView().getTxtQuadril().setText("");
        getView().getTxtPeso().setText("");
    }

    public static CadastroPresenter pegarInstancia(Log log) {
        if (instancia == null) {
            instancia = new CadastroPresenter(log);
        }
        return instancia;
    }

    private CadastroPresenter(final Log log) {
        grupo.add(view.getRadioFeminino());
        grupo.add(view.getRadioMasculino());
        view.setVisible(true);
        this.log = log;



        view.getBtnCadastrar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (getView().getFtfCPF().getText().trim().length() < 14) {
                    JOptionPane.showMessageDialog(getView(), "Erro informe o CPF completo!", "Erro", JOptionPane.ERROR_MESSAGE);
                } else {
                    try {
                        novoPaciente();
                        notifyObservers();
                        log.escreverMessage("Inserindo o paciente de nome : " + getView().getTxtNome().getText() + " de peso :" + getView().getTxtPeso().getText() + " e altura : " + getView().getTxtAltura().getText());
                        organizatexto.trocaParaVirgula(getView().getTxtAltura(), getView().getTxtCintura(), getView().getTxtIdade(), getView().getTxtPeso(), getView().getTxtQuadril());
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(getView(), "Erro ao cadastrar o cliente,verifique se os campos foram preenchidos de forma correta!", "Erro", JOptionPane.ERROR_MESSAGE);
                    }

                }
            }
        });

        view.getBtnNovoCliente().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                habilitaBotoes();
                hc.habilitaCampos(getView().getTxtNome(), getView().getTxtAltura(), getView().getTxtCintura(), getView().getTxtIdade(), getView().getTxtPeso(), getView().getTxtQuadril(), getView().getRadioFeminino(), getView().getRadioMasculino(), getView().getFtfCPF());
                limpaCampos();
            }
        });



        view.getBtnFechar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                getView().dispose();
            }
        });

    }

    public void novoPaciente() {
        CadastrarCommand cadastro = new CadastrarCommand(this);
        cadastro.execute();
        
    }

    public void habilitaBotoes() {
        getView().getBtnCadastrar().setEnabled(true);
        getView().getBtnNovoCliente().setEnabled(true);

    }

    public void desabilitaBotoes() {
        getView().getBtnCadastrar().setEnabled(false);
        getView().getBtnNovoCliente().setEnabled(false);

    }

    public Integer ajustaIdade(String campoIdade) {
        int a;
        a = (int) (Double.parseDouble(campoIdade));
        return a;
    }

    public void setIacImc() {
        organizatexto.trocaParaPonto(getView().getTxtAltura(), getView().getTxtCintura(), getView().getTxtIdade(), getView().getTxtPeso(), getView().getTxtQuadril());
        CalculaIMC calculaimc = new CalculaIMC();
        CalculaIAC calculaiac = new CalculaIAC();
        imc = (calculaimc.CalculaIMC(getView().getTxtAltura(), getView().getTxtPeso(), getView().getRadioMasculino()));
        iac = (calculaiac.calculaIAC(getView().getTxtAltura(), getView().getTxtQuadril(), getView().getRadioMasculino()));
    }

    

     
    /**
     * @return the view
     */
    public CadastroCliente getView() {
        return view;
    }

    /**
     * @param view the view to set
     */
    public void setView(CadastroCliente view) {
        this.view = view;
    }

    
  @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer ob : observers) {
            ob.update(1);
        }
    }

  
}
